package com.github.livebase.player;

import android.content.res.AssetFileDescriptor;
import android.view.Surface;
import android.view.SurfaceHolder;

import com.github.livebase.util.base.CollectionsUtil;

import java.util.List;
import java.util.Map;


/**
 * @ClassName IMediaPlayer
 * @description:
 * @author: biao532
 * @create: 2023-12-18 13:03
 * @Version 1.0
 **/
public interface IMediaPlayer {
    class Option {
        private int category;
        private String name;
        private String value;
        public Option() {

        }
        public Option(int category, String name, String value) {
            this.category = category;
            this.name = name;
            this.value = value;
        }

        public String getName() {
                return name;
            }
        public int getCategory() {
                return category;
            }
        public String getValue() {
                return value;
            }

        public void setName(String name) {
                this.name = name;
            }

        public void setCategory(int category) {
                this.category = category;
            }

        public void setValue(String value) {
                this.value = value;
            }
    }
        /**
         * 视频/音频开始渲染
         */
        int MEDIA_INFO_RENDERING_START = 3;

        /**
         * 缓冲开始
         */
        int MEDIA_INFO_BUFFERING_START = 701;

        /**
         * 缓冲结束
         */
        int MEDIA_INFO_BUFFERING_END = 702;

        /**
         * 视频旋转信息
         */
        int MEDIA_INFO_VIDEO_ROTATION_CHANGED = 10001;

        void setOption(Option option);

        /**
         * 设置播放地址
         *
         * @param path    播放地址
         * @param headers 播放地址请求头
         */
        void setDataSource(String path, Map<String, String> headers);

        /**
         * 用于播放raw和asset里面的视频文件
         */
        void setDataSource(AssetFileDescriptor fd);

        /**
         * 播放
         */
        void start();

        /**
         * 暂停
         */
        void pause();

        /**
         * 停止
         */
        void stop();

        /**
         * 准备开始播放（异步）
         */
        void prepareAsync();

        /**
         * 重置播放器
         */
        void reset();

        /**
         * 是否正在播放
         */
        boolean isPlaying();

        /**
         * 调整进度
         */
        void seekTo(long time);

        /**
         * 释放播放器
         */
        void release();

        /**
         * 获取当前播放的位置
         */
        long getCurrentPosition();

        /**
         * 获取视频总时长
         */
        long getDuration();

        /**
         * 获取缓冲百分比
         */
        int getBufferedPercentage();

        /**
         * 设置渲染视频的View,主要用于TextureView
         */
        void setSurface(Surface surface);

        /**
         * 设置渲染视频的View,主要用于SurfaceView
         */
        void setDisplay(SurfaceHolder holder);

        /**
         * 设置音量
         */
        void setVolume(float v1, float v2);

        /**
         * 设置是否循环播放
         */
        void setLooping(boolean isLooping);

        /**
         * 设置其他播放配置
         */
        default void setOptions(List<Option> options) {
            CollectionsUtil.foreach(options, this::setOption);
        }

        /**
         * 设置播放速度
         */
        void setSpeed(float speed);

        /**
         * 获取播放速度
         */
        float getSpeed();

        /**
         * 获取当前缓冲的网速
         */
        long getTcpSpeed();

        /**
         * 绑定VideoView
         */
        void setPlayerEventListener(PlayerEventListener playerEventListener);

        interface PlayerEventListener {

            void onError();

            void onCompletion();

            void onInfo(int what, int extra);

            void onPrepared();

            void onVideoSizeChanged(int width, int height);

            void onSeekComplete(IMediaPlayer iMediaPlayer);

        }

}
